import sqlite3
import os
from tools import *
from tab_func import *

class SysSqlite():
    def __init__(self):
        self.filename = 'base.db'
        self.tools    = Tools()
        self.tab_func = TabFunc()

        if os.path.exists(self.filename):
            self.is_ready = True
        else:
            self.is_ready = False
            print(f"文件【{self.filename}】不存在")

    def query(self, sql):
        """执行查询，返回字典的列表
        """
        print("query", sql)
        if self.is_ready == False: return False
        # 连接到SQLite数据库（如果文件不存在，会自动创建）
        conn = sqlite3.connect(self.filename)
        conn.row_factory = self.__dict_factory
        c = conn.cursor()
        
        # # 创建表
        # c.execute('''CREATE TABLE IF NOT EXISTS stocks
        #             (date text, trans text, symbol text, qty real, price real)''')
                    
        # # 插入数据
        # c.execute("INSERT INTO stocks VALUES ('2023-04-01','BUY','RHAT',100,35.14)")
        # conn.commit()  # 提交事务，保存更改到数据库中
                    
        # 查询数据并打印结果
        ret = False
        try:
            c.execute(sql)
            ret = c.fetchall()
        # except sqlite3.OperationalError:
        except sqlite3.Error as e:
            print(f"{__name__} Error: {e};sql:{sql}")
            self.tools.msg(f"SQL[{sql}]错误:{e}", 'error', 'SQL')

        # 关闭cursor和连接以释放资源
        c.close()  # 关闭cursor对象，但不是必须的，因为conn.close()会关闭它。但这是一个好习惯。
        conn.close()  # 关闭连接对象。

        return ret

    def query2(self, sql, where_exp = '', order_exp = ''):
        """生成SQL，再执行查询
        """
        return self.query(self.tab_func.gen_sql(sql, where_exp, order_exp))

    def __dict_factory(self, cursor, row):
        """生成字典形式数据
        """
        d = {}
        for idx, col in enumerate(cursor.description):
            # print("__dict_factory", idx, col)
            d[col[0]] = row[idx]
        return d

    def add(self, data):
        pass
    def delete(self, data):
        pass
    def update(self, data):
        pass